iT邦幫忙

2026 iThome 鐵人賽

DAY 24
0
Vibe Coding

從課堂半成品到完整發布:獨立遊戲的30天重生記系列 第 24 篇

【DAY24】Unity 2D 敘事遊戲開發:主選單成就清單與灰階視覺化(Achievement System Part 2 - Main Menu UI & GrayScale)

  • 分享至 

  • xImage
  •  

一、前言
在昨天完成成就系統的資料與管理器架構後,今天我們要正式進入 UI 視覺化階段。透過主選單的介面綁定、動態網格排版,以及解鎖狀態的灰階判定,讓玩家能直觀地檢視自己的冒險成就與收集進度!

二、UI 架構與 3x2 格狀網格優化
為了讓成就面板呈現美觀且好閱讀的介面,我們在 UI 排版上進行了以下優化:

  • 放棄 ScrollView 改用 Grid Layout Group: 由於成就數量固定,改用 Grid Layout Group 搭配 Fixed Column Count(固定 3 欄),完美呈現 3×2 雙排網格 的整齊視覺。
  • 卡片尺寸與間距微調: 將成就卡片 Prefab (AchievementItem) 設為長條形尺寸(寬 200、高 80),並精準設定 Cell Size 與 Spacing,讓圖標、名稱與描述完美嵌在面板的羊皮紙背景中。

三、核心程式實作:AchievementItemUI 與視覺灰階切換
我們建立了 AchievementItemUI.cs 來負責將 ScriptableObject 的資料對應到畫面上的 UI 元件,並根據解鎖狀態動態切換圖標的彩色與灰階:

using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class AchievementItemUI : MonoBehaviour {
    [Header("UI 元件參考")]
    [SerializeField] private Image iconImage;
    [SerializeField] private TextMeshProUGUI nameText;
    [SerializeField] private TextMeshProUGUI descText;

    [Header("視覺設定")]
    [SerializeField] private Color unlockedColor = Color.white;
    [SerializeField] private Color lockedColor = new Color(0.3f, 0.3f, 0.3f, 1f); // 灰階暗色

    // 初始化並繫結成就資料
    public void Setup(AchievementData data)  {
        nameText.text = data.achievementName;
        descText.text = data.description;
        iconImage.sprite = data.iconSprite;

        // 根據是否解鎖切換顏色(灰階視覺化)
        if (data.isUnlocked) {
            iconImage.color = unlockedColor;
            nameText.gameObject.SetActive(true);
            descText.gameObject.SetActive(true);
        }
        else {
            iconImage.color = lockedColor;
            // 未解鎖時可以隱藏或顯示問號提示
        }
    }
}

四、Unity Editor 與面板串接步驟

  • 建立成就卡片 Prefab: 在 Prefab 中建立子物件 IconImage、NameText、DescText,並掛上 AchievementItemUI 腳本,將對應元件分別拖入 Inspector 欄位。
  • 綁定面板容器: 在 AchievementPanelUI 中將 Content Parent 指定為帶有 Grid Layout Group 的 AchievementContainer,供程式動態生成所有成就清單。
  • 關閉按鈕(CROSS)互動整合: 為面板的關閉按鈕綁定 Button 的 OnClick() 事件,串接 GameObject.SetActive(false),實現流暢的介面開關切換。
    https://ithelp.ithome.com.tw/upload/images/20260930/20184073yXLIm6vedI.png
    圖一、架構圖

https://ithelp.ithome.com.tw/upload/images/20260930/20184073mYAMuLJE3E.png
圖二、AchievementContainer面板
https://ithelp.ithome.com.tw/upload/images/20260930/20184073wp6dT3X1vm.png
圖三、AchievementManager面板
https://ithelp.ithome.com.tw/upload/images/20260930/20184073FEVCeeVXs4.png
圖四、Button-CROSS的 OnClick() 事件

五、開發實戰經驗:踩雷坑與架構反思

  • Pitfall 1:資料與 UI 混淆:
    • 開發時容易誤把 ScriptableObject 資料檔直接拖進 UI 腳本的欄位。記住:腳本要拉的是「卡片自己身上的子物件(Image / TMP)」,而不是獨立的資料資產!
  • Pitfall 2:底層白紙覆蓋:
    • 動態生成的卡片根物件若帶有未關閉的 Image 元件且預設為純白色,會蓋掉後方的背景。記得將根物件的 Image 關閉或調整 Alpha 透明度,讓介面完美融合。

六、今日成果與小結

  • 視覺化呈現: 成功透過 Grid Layout Group 完成 3x2 成就牆排版。
  • 狀態判定: 串接資料與 UI 腳本,實現未解鎖顯示灰階的沉浸式收集體驗!
    https://ithelp.ithome.com.tw/upload/images/20260930/20184073zro8XmObHT.png
    圖四、主畫面展示

https://ithelp.ithome.com.tw/upload/images/20260930/20184073CGFOdbcpE2.png
圖五、點擊成就選單後顯示尚未收集的成就

DAY 24 的內容主要是實作「成就系統的 UI 視覺化」,包含了建立 AchievementItemUI.cs 來處理灰階/彩色狀態切換、設定 3x2 網格排版(Grid Layout Group),以及成就面板的開關與串接。因為這直接延續了昨天(Day 23)建立的成就系統架構,所以它依然屬於同一個專屬分支:

  1. 檢查修改狀態:
    git status

  2. 加入暫存區並提交 Commit:
    git add .
    git commit -m "feat: 實作 AchievementItemUI 介面控制器與 3x2 網格排版,完成成就牆視覺化與灰階狀態切換"

  3. 將新分支推送到遠端倉庫:
    git push origin feature/achievement-system


上一篇
【DAY23】Unity 2D 敘事遊戲開發:成就系統核心架構與資料模型(Achievement System Part 1 - Data & ScriptableObject)
系列文
從課堂半成品到完整發布:獨立遊戲的30天重生記 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言